package com.chen.Dome7ececutorService;

import java.util.concurrent.*;

public class EcecutorServiceDome1 {
    public static void main(String[] args) {
        //目标；创建线程池对象里使用，处理Runnable接口实现类对象
        //1.使用线程池的实现类ThreadPoolExecutor声明7个参数
        ExecutorService pool = new ThreadPoolExecutor(3,5,10,
                TimeUnit.SECONDS,new ArrayBlockingQueue<>(3), Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy()
        );
        //2.使用线程池的execute方法执行任务
        Runnable r1 = new MyRunnable();
        pool.execute(r1);//第一线程池在忙
        pool.execute(r1);//第二个线程池在忙
        pool.execute(r1);//第三个线程池在忙
        pool.execute(r1);//线程池可以重复使用
        pool.execute(r1);
        pool.execute(r1);
        pool.execute(r1);//此时会创造临时线程
        pool.execute(r1);//此时会创造临时线程
        pool.execute(r1);//此时执行拒绝策略

        //3.关闭线程池对象,一般不关闭线程池
//        pool.shutdown();//会等任务执行完才关闭
//        pool.shutdownNow();//立即关闭


    }
}
/*
1.corePoolSize（核心线程数）：
线程池中保持最小活动数的线程数量。
当线程池中的线程数目小于核心线程数时，即使有空闲线程，线程池也会优先创建新线程来处理任务。
核心线程会一直存活，即使没有任务需要执行（除非设置了allowCoreThreadTimeout=true，这样核心线程在空闲时间超过keepAliveTime后也会关闭）。
2.maximumPoolSize（最大线程数）：
线程池能够容纳的最大线程数。
当线程池中的线程数目已经达到核心线程数，并且任务队列也已经满了，此时线程池会创建新的线程来执行任务，直到线程数目达到最大线程数。
最大线程数受属性CAPACITY的限制，最大为(2^29)-1（约5亿）。
3.keepAliveTime（线程存活时间）：
线程池中超出核心线程数的线程的存活时间。
当这些线程在空闲的持续时间超过keepAliveTime时，它们将被终止，直到线程数量降低到核心线程数为止。
如果allowCoreThreadTimeout被设置为true，则核心线程也会受这个存活时间的限制。
4.unit（存活时间单位）：
keepAliveTime参数的时间单位。
可以是TimeUnit.NANOSECONDS（纳秒）、TimeUnit.MICROSECONDS（微秒）、TimeUnit.MILLISECONDS（毫秒）、TimeUnit.SECONDS（秒）等。
5.workQueue（工作队列）：
用于保存等待执行的任务的队列。
ThreadPoolExecutor提供了多种工作队列类型，如ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue等。
队列的选择取决于应用程序的需求和特性，例如需要控制队列的容量并防止内存泄漏时，可以使用ArrayBlockingQueue或LinkedBlockingQueue；需要实现多个线程之间的交互时，可以使用SynchronousQueue。
6.threadFactory（线程工厂）：
用于创建新的线程的工厂接口。
可以通过这个工厂接口来配置线程的名称、优先级等属性。
默认情况下，可以使用Executors.defaultThreadFactory()来创建线程。
7.handler（拒绝策略）：
当工作队列和线程池都已满，并且有更多任务需要执行时，所采取的操作。
ThreadPoolExecutor提供了几种内置的拒绝策略，如AbortPolicy（抛出异常）、CallerRunsPolicy（由调用线程执行任务）、DiscardPolicy（丢弃任务）、DiscardOldestPolicy（丢弃队列中最老的任务）。
也可以实现RejectedExecutionHandler接口来自定义拒绝策略。
 */